/**
 * 高阶函数：如果一个函数的形参或返回值也是一个函数
 */

//  1. 回调函数=>接收数据
let $ajax = (url, callback) => {
  setTimeout(() => {
    callback({ status: 200, data: [] })
  }, 2000)
}
$ajax('api/path', (res) => {
  console.log(res)
})

// 2. 闭包=>作用：1. 内部定义的变量常驻内存 2. 避免全局变量污染
// 写一个函数，返回一个新函数=》每次执行都会自加一？
const Fnc = () => {
  let count = 0
  return () => {
    count++
    console.log(count)
  }
}

let innerFn = Fnc()

  ; (function (w) {
    console.log(w)
    var abc = 100
  })(window)

// 3. 函数柯里化：把一个多参函数变为单参函数，同时接收余下参数和结果的函数
// 作用：1. 参数复用 2. 延迟调用
// 多参函数
const add = function (a, b, c) {
  return a + b + c
}
// 变为单参函数（函数柯里化）
let fn = (a) => {
  return (b) => {
    return (c) => {
      return a + b + c
    }
  }
}
console.log(fn(1)(2)(3))
let fn2 = fn(10)(30)
console.log(fn2(200), fn2(1000))

